/**
 * 包含文件上传,input 文件类型识别,生成图片base64等与文件和上传有关的函数
 * Created by haua on 16/8/4.
 */
(function () {
    if(!window.H)
        window.H = {};
    

    /**
     * 上传文件等比较大的东西时用的，这个能显示进度
     * 如果传入的数据是new FormData($('form')[0])，
     * 选择的form必须有这个属性：enctype="multipart/form-data"，
     * 所有input，都一定要有name才会上传的，包括file input和其他input。
     * @param url string
     * @param data mixed 可以是obj
     * @param fn function
     * @param progress function 处理上传进度的方法，回调此函数时会传入一个参数：{
     *      lengthComputable:true //是否有进度可以显示
     *      loaded:1567 //已上传字节数
     *      total:84656 //总共字节数 字节/1024/1024等于mb
     * }
     * */
    H.upload = function(url, data, fn, progress){
        if (!data)
            return;
        if (!(data instanceof FormData)){
            var dataObj = {};
            if (typeof data == 'string'){
                data = data.split('&');
            }

            var i = 0,dNum;
            if (data instanceof Array){
                var keyName = [];
                for(i=0,dNum=data.length;i<dNum;i++){
                    if(typeof data[i] == 'string'){
                        keyName = data[i].split('=');
                        var key = keyName[0];
                        if (keyName[1]) {
                            if (key.search(/\[\]$/) >= 0) {//name是数组的情况下要这样做。
                                key = key.replace(/\[\]$/, '');

                                if (!(dataObj[key] instanceof Array))
                                    dataObj[key] = [];

                                dataObj[key].push(keyName[1]);
                            } else
                                dataObj[key] = keyName[1];
                        }
                    }
                }
            }else if(data.nodeName != 'FORM'&&typeof data=='object'){
                dataObj = data;
            }

            if (data.nodeName != 'FORM') {
                var formData = new FormData(document.createElement("form"));
                for (var a in dataObj) {
                    if (dataObj.hasOwnProperty(a)) {
                        if (dataObj[a] instanceof Array) {
                            var arr = dataObj[a], aNum = arr.length;
                            for (i = 0; i < aNum; i++) {
                                formData.append(a + '[]', arr[i]);
                            }
                        } else
                            formData.append(a, dataObj[a]);
                    }
                }
                data = formData;
            } else {
                data = new FormData(data);
            }
        }

        $.ajax({
            url: url,  //server script to process data
            type: 'POST',
            xhr: function(){  // custom xhr
                var myXhr = $.ajaxSettings.xhr();
                if (myXhr.upload){ // check if upload property exists
                    myXhr.upload.addEventListener('progress', progress, false); //处理上传进度的。
                }
                return myXhr;
            },
            //Ajax事件
            complete: function(data){
                //alert(H.json(data.responseText,'origin'));
                fn&&fn(data.responseText);
            },
            // Form数据
            data: data,
            //Options to tell JQuery not to process data or worry about content-type
            cache: false,
            contentType: false,
            processData: false
        });
    };
    
    /**
     * 判断文件的类型,目前只支持图片和视频
     * @param file file
     * */
    H.fileType = function (file) {
        if(!file)return false;

        //判断文件类型
        var fileType;
        if(file.type){
            fileType = file.type.indexOf('image')>=0?'image':(file.type.indexOf('video')>=0?'video':'');
        }else{
            var suffix = file.name.split('.').pop(),
                imgSuffix = 'jpg,jpeg,png,gif,jpe',
                videoSuffix = 'mp4,mov,avi,3gp,flv,rm,real';
            fileType = imgSuffix.indexOf(suffix)>=0?'image':(videoSuffix.indexOf(suffix)>=0?'video':'');
        }
        return fileType;
    };
    
    /**
     * 把img图片转换成base64格式，兼容ios和Android还有pc ,要引用 load-image.all.min.js 才有效
     * ps. 这是异步返回的。
     * @param file String/ImgDOM 可以是图片的url，也可以是img DOM。
     * @param fn function 成功或者失败都回调的函数，结果会在回调函数的第一个参数里，如果有exif，第二个参数会带上。
     * @param options Object 各种参数
     * 		@object dataType string ='jpeg' 要转换的格式类型，有png，jpeg,svg+xml
     *		@object Number quality 0-1,如果是jpeg，这个参数代表转换质量
     *		@object Number maxWidth 转换后的图片大小，省略表示按照原图大小
     */
    H.imgTobase64 = function(file,fn,options){
        if(!window.loadImage)
            console.error('【H.imgTobase64】没有引用 load-image.all.min.js');
        loadImage.parseMetaData(file,function(data){
            var exif = false;
            options = options||{};
            if(data.exif){//如果图片有exif信息
                exif = data.exif.getAll();
                options.orientation = data.exif.get('Orientation');//getAll中的Orientation和单独get的值是不一样的...
            }
            options.canvas = true;
            loadImage(file,function(canvas){
                var dataType = 'image/'+(options.dataType||'jpeg');
                var quality = options.quality||1;
                window.c = canvas;
                //console.log(window.c);
                fn(canvas.toDataURL(dataType,quality),exif);
            },options);
        });
    };
    
}());